import os
import sys
from pathlib import Path
from typing import Final,Optional

class ProjectPathManager:
    """项目路径管理类（强化模板路径匹配）"""
    _instance = None

    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
            cls._instance._init_paths()
        return cls._instance

    def _init_paths(self):
        # 基础路径识别（开发环境/打包环境）
        self._base_dir: Final[Path] = (
            Path(sys.executable).parent  # 打包后的exe路径
            if getattr(sys, 'frozen', False)
            else Path(__file__).parent.parent  # 开发环境项目根目录（假设path.py在config目录下）
        )

        # 关键目录路径定义（明确模板目录位置）
        self.config_dir: Final[Path] = self._base_dir / "config"
        self.static_dir: Final[Path] = self._base_dir / "static"
        self.template_dir: Final[Path] = self._base_dir / "template"  # 模板文件存放目录（固定为项目根目录下的templates）
        self.output_dir: Final[Path] = self._base_dir / "output"       # 输出文件目录

        # 自动创建必要目录
        self._ensure_dir_exists(self.template_dir)
        self._ensure_dir_exists(self.output_dir)

    @staticmethod
    def _ensure_dir_exists(directory: Path):
        """确保目录存在（递归创建）"""
        if not directory.exists():
            directory.mkdir(parents=True, exist_ok=True)
                                                                                                   
    def get_template_path(self, sheet_name: str) -> Path:
        """
        根据sheet名称获取对应模板路径
        严格遵循命名规则：模板文件名 = sheet名称 + ".xlsx"
        示例：sheet_name="JS101" → 路径为 templates/JS101.xlsx
        """
        return self.template_dir/ sheet_name / f"{sheet_name}.xlsx"

    def get_output_path(self, filename: str, sub_dir: Optional[str] = None):
        base_output = self.output_base_path  # 来自 set_output_base_path()
        if sub_dir:
            base_output = Path(base_output) / sub_dir
        base_output.mkdir(parents=True, exist_ok=True)
        return Path(base_output) / f"{filename}.xlsx"
    
    def set_output_base_path(self, path):
        self.output_base_path = path
    

# 全局单例实例
path_manager = ProjectPathManager()

 
print(path_manager.get_template_path("JS101"))